/*
 * SPDX-FileCopyrightText: 2022 Andrew Gunnerson
 * SPDX-License-Identifier: GPL-3.0-only
 */

package com.sanji.audio_test.format

import android.media.MediaCodec
import android.media.MediaFormat
import android.media.MediaMuxer
import java.io.FileDescriptor
import java.nio.ByteBuffer

/**
 * [MediaMuxer] 的轻量级包装器
 *
 * @param fd 输出文件描述符。该类不拥有文件描述符的所有权
 * @param containerFormat 输出容器格式的有效 [MediaMuxer.OutputFormat] 值
 */
class MediaMuxerContainer(
    fd: FileDescriptor,
    containerFormat: Int,
) : Container {
    private val muxer = MediaMuxer(fd, containerFormat)  // MediaMuxer 实例

    /**
     * 启动复用器
     */
    override fun start() =
        muxer.start()

    /**
     * 停止复用器
     */
    override fun stop() =
        muxer.stop()

    /**
     * 释放复用器资源
     */
    override fun release() =
        muxer.release()

    /**
     * 向容器添加轨道
     * 
     * @param mediaFormat 媒体格式
     * @return 轨道索引
     */
    override fun addTrack(mediaFormat: MediaFormat): Int =
        muxer.addTrack(mediaFormat)

    /**
     * 将样本数据写入容器
     * 
     * @param trackIndex 轨道索引
     * @param byteBuffer 包含样本数据的字节缓冲区
     * @param bufferInfo 缓冲区信息
     */
    override fun writeSamples(trackIndex: Int, byteBuffer: ByteBuffer,
                              bufferInfo: MediaCodec.BufferInfo) =
        muxer.writeSampleData(trackIndex, byteBuffer, bufferInfo)
}